home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / unixSyscall / ioctl.c < prev    next >
C/C++ Source or Header  |  1991-07-17  |  16KB  |  613 lines

  1. /* 
  2.  * ioctl.c --
  3.  *
  4.  *    Procedure to map from Unix ioctl system call to Sprite.
  5.  *
  6.  * Copyright 1986 Regents of the University of California
  7.  * All rights reserved.
  8.  */
  9.  
  10. #ifndef lint
  11. static char rcsid[] = "$Header: /sprite/src/lib/c/unixSyscall/RCS/ioctl.c,v 1.15 91/07/17 16:03:11 mgbaker Exp $ SPRITE (Berkeley)";
  12. #endif not lint
  13.  
  14. #include <sys/ioctl.h>
  15. #include <sys/termios.h>
  16. #include <sprite.h>
  17. #include <stdio.h>
  18. #include <compatInt.h>
  19. #include <dev/tty.h>
  20. #include <dev/net.h>
  21. #include <dev/graphics.h>
  22. #include <fs.h>
  23. #include <errno.h>
  24.  
  25. #include <sys/types.h>
  26. #include <fcntl.h>
  27. #include <sys/socket.h>
  28. #include <sys/ttychars.h>
  29. #include <sys/ttydev.h>
  30. #include <net/route.h>
  31. #include <net/if.h>
  32. #include <sys/time.h>
  33. #include <dev/audio.h>
  34. #include <sys/audioio.h>
  35.  
  36. #ifdef __STDC__
  37. static void DecodeRequest(int request);
  38. #else
  39. #define const
  40. static void DecodeRequest();
  41. #endif
  42.  
  43. #ifdef notdef
  44. int compatTapeIOCMap[] = {
  45.     IOC_TAPE_WEOF,         /* 0, MTWEOF */
  46.     IOC_TAPE_SKIP_FILES,    /* 1, MTFSF */
  47.     IOC_TAPE_BACKUP_FILES,    /* 2, MTBSF */
  48.     IOC_TAPE_SKIP_BLOCKS,    /* 3, MTFSR */
  49.     IOC_TAPE_BACKUP_BLOCKS,    /* 4, MTBSR */
  50.     IOC_TAPE_REWIND,         /* 5, MTREW */
  51.     IOC_TAPE_OFFLINE,         /* 6, MTOFFL */
  52.     IOC_TAPE_NO_OP,        /* 7, MTNOP */
  53.     IOC_TAPE_RETENSION,        /* 8, MTRETEN */
  54.     IOC_TAPE_ERASE,        /* 9, MTERASE */
  55. };
  56. #endif
  57.  
  58.  
  59. /*
  60.  *----------------------------------------------------------------------
  61.  *
  62.  * ioctl --
  63.  *
  64.  *    Compat procedure for Unix ioctl call. This procedure usually does
  65.  *    nothing.
  66.  *
  67.  * Results:
  68.  *    Returns UNIX_ERROR if there's no known way to emulate the ioctl
  69.  *    under Sprite.  Otherwise, returns whatever UNIX would return.
  70.  *
  71.  * Side effects:
  72.  *    None.
  73.  *
  74.  *----------------------------------------------------------------------
  75.  */
  76.  
  77. int
  78. ioctl(fd, request, buf)
  79.     int        fd;
  80.     int        request;
  81.     char *    buf;
  82. {
  83.     ReturnStatus    status;
  84.  
  85.     switch (request) {
  86.  
  87.     /*
  88.      * Generic calls:
  89.      */
  90.  
  91.     case FIOCLEX: {
  92.         /*
  93.          * Set the close-on-exec bit for the file.
  94.          * Buf is not used.
  95.          */
  96.  
  97.         int flag = IOC_CLOSE_ON_EXEC;
  98.         status = Fs_IOControl(fd, IOC_SET_BITS, 
  99.                 sizeof(flag), (Address) &flag, 0, (Address) NULL);
  100.         }
  101.         break;
  102.  
  103.     case FIONCLEX: {
  104.         /*
  105.          * Clear the close-on-exec bit for the file.
  106.          * Buf is not used.
  107.          */
  108.  
  109.         int flag = IOC_CLOSE_ON_EXEC;
  110.         status = Fs_IOControl(fd, IOC_CLEAR_BITS, 
  111.                 sizeof(flag), (Address) &flag, 0, (Address) NULL);
  112.         }
  113.         break;
  114.  
  115.     case FIONREAD:
  116.         status = Fs_IOControl(fd, IOC_NUM_READABLE, 0, (Address) NULL,
  117.             sizeof(int), buf);
  118.         break;
  119.  
  120.         case FIONBIO: {
  121.         /*
  122.          * Set or clear the non-blocking I/O bit for the file.
  123.          */
  124.  
  125.         int flag = IOC_NON_BLOCKING;
  126.         if (*(int *)buf) {
  127.             status = Fs_IOControl(fd, IOC_SET_BITS, 
  128.                 sizeof(flag), (Address) &flag, 0, (Address) NULL);
  129.         } else {
  130.             status = Fs_IOControl(fd, IOC_CLEAR_BITS, 
  131.                 sizeof(flag), (Address) &flag, 0, (Address) NULL);
  132.         }
  133.         }
  134.         break;
  135.  
  136.     case FIOASYNC: {
  137.         /*
  138.          * Set or clear the asynchronous I/O bit for the file.
  139.          */
  140.  
  141.         int flag = IOC_ASYNCHRONOUS;
  142.         if (*(int *)buf) {
  143.             status = Fs_IOControl(fd, IOC_SET_BITS, 
  144.                 sizeof(flag), (Address) &flag, 0, (Address) NULL);
  145.         } else {
  146.             status = Fs_IOControl(fd, IOC_CLEAR_BITS, 
  147.                 sizeof(flag), (Address) &flag, 0, (Address) NULL);
  148.         }
  149.         }
  150.         break;
  151.  
  152.  
  153.     case FIOGETOWN:
  154.     case SIOCGPGRP:
  155.     case TIOCGPGRP: {
  156.         int procOrFamily;
  157.  
  158.         status = Ioc_GetOwner(fd, (int *)buf, &procOrFamily);
  159.         }
  160.         break;
  161.  
  162.     case FIOSETOWN:
  163.     case SIOCSPGRP:
  164.     case TIOCSPGRP:
  165.         status = Ioc_SetOwner(fd, *(int *)buf, IOC_OWNER_FAMILY);
  166.         break;
  167.  
  168.     /* 
  169.      * Tty-related calls:
  170.      */
  171.  
  172.     case TIOCGETP:
  173.         status = Fs_IOControl(fd, IOC_TTY_GET_PARAMS, 0, (Address) NULL,
  174.             sizeof(struct sgttyb), (Address) buf);
  175.         break;
  176.     case TIOCSETP:
  177.         status = Fs_IOControl(fd, IOC_TTY_SET_PARAMS, sizeof(struct sgttyb),
  178.             (Address) buf, 0, (Address) NULL);
  179.         break;
  180.     case TIOCSETN:
  181.         status = Fs_IOControl(fd, IOC_TTY_SETN, sizeof(struct sgttyb),
  182.             (Address) buf, 0, (Address) NULL);
  183.         break;
  184.     case TIOCEXCL:
  185.         status = Fs_IOControl(fd, IOC_TTY_EXCL, 0, (Address) NULL,
  186.             0, (Address) NULL);
  187.         break;
  188.     case TIOCNXCL:
  189.         status = Fs_IOControl(fd, IOC_TTY_NXCL, 0, (Address) NULL,
  190.             0, (Address) NULL);
  191.         break;
  192.     case TIOCHPCL:
  193.         status = Fs_IOControl(fd, IOC_TTY_HUP_ON_CLOSE, 0,
  194.             (Address) NULL, 0, (Address) NULL);
  195.         break;
  196.     case TIOCFLUSH:
  197.         status = Fs_IOControl(fd, IOC_TTY_FLUSH, sizeof(int),
  198.             (Address) buf, 0, (Address) NULL);
  199.         break;
  200.     case TIOCSTI:
  201.         status = Fs_IOControl(fd, IOC_TTY_INSERT_CHAR, sizeof(char),
  202.             (Address) buf, 0, (Address) NULL);
  203.         break;
  204.     case TIOCSBRK:
  205.         status = Fs_IOControl(fd, IOC_TTY_SET_BREAK, 0,
  206.             (Address) NULL, 0, (Address) NULL);
  207.         break;
  208.     case TIOCCBRK:
  209.         status = Fs_IOControl(fd, IOC_TTY_CLEAR_BREAK, 0,
  210.             (Address) NULL, 0, (Address) NULL);
  211.         break;
  212.     case TIOCSDTR:
  213.         status = Fs_IOControl(fd, IOC_TTY_SET_DTR, 0, 
  214.             (Address) NULL, 0, (Address) NULL);
  215.         break;
  216.     case TIOCCDTR:
  217.         status = Fs_IOControl(fd, IOC_TTY_CLEAR_DTR, 0,
  218.             (Address) NULL, 0, (Address) NULL);
  219.         break;
  220.     case TIOCGETC:
  221.         status = Fs_IOControl(fd, IOC_TTY_GET_TCHARS, 0, (Address) NULL,
  222.             sizeof(struct tchars), (Address) buf);
  223.         break;
  224.     case TIOCSETC:
  225.         status = Fs_IOControl(fd, IOC_TTY_SET_TCHARS,
  226.             sizeof(struct tchars), (Address) buf, 0, (Address) NULL);
  227.         break;
  228.     case TIOCGLTC:
  229.         status = Fs_IOControl(fd, IOC_TTY_GET_LTCHARS, 0, (Address) NULL,
  230.             sizeof(struct ltchars), (Address) buf);
  231.         break;
  232.     case TIOCSLTC:
  233.         status = Fs_IOControl(fd, IOC_TTY_SET_LTCHARS,
  234.             sizeof(struct ltchars), (Address) buf, 0, (Address) NULL);
  235.         break;
  236.     case TIOCLBIS:
  237.         status = Fs_IOControl(fd, IOC_TTY_BIS_LM,
  238.             sizeof(int), (Address) buf, 0, (Address) NULL);
  239.         break;
  240.     case TIOCLBIC:
  241.         status = Fs_IOControl(fd, IOC_TTY_BIC_LM,
  242.             sizeof(int), (Address) buf, 0, (Address) NULL);
  243.         break;
  244.     case TIOCLSET:
  245.         status = Fs_IOControl(fd, IOC_TTY_SET_LM,
  246.             sizeof(int), (Address) buf, 0, (Address) NULL);
  247.         break;
  248.     case TIOCLGET:
  249.         status = Fs_IOControl(fd, IOC_TTY_GET_LM, 0, (Address) NULL,
  250.             sizeof(int), (Address) buf);
  251.         break;
  252.     case TIOCGETD:
  253.         status = Fs_IOControl(fd, IOC_TTY_GET_DISCIPLINE, 0,
  254.             (Address) NULL, sizeof(int), (Address) buf);
  255.         break;
  256.     case TIOCSETD:
  257.         status = Fs_IOControl(fd, IOC_TTY_SET_DISCIPLINE,
  258.         sizeof(int), (Address) buf, 0, (Address) NULL);
  259.         break;
  260.  
  261.     case SIOCATMARK:
  262.         status = Fs_IOControl(fd, IOC_NET_IS_OOB_DATA_NEXT,
  263.                 0, (Address) NULL, sizeof(int), (Address) buf);
  264.         break;
  265.  
  266.         case TCGETS:
  267.         status = Fs_IOControl(fd, IOC_TTY_GET_TERMIO,
  268.         0, (Address) NULL, sizeof(struct termios), (Address) buf);
  269.         break;
  270.  
  271.         case TCSETS:
  272.         status = Fs_IOControl(fd, IOC_TTY_SET_TERMIO,
  273.         sizeof(struct termios), (Address) buf, 0, (Address) NULL);
  274.         break;
  275.  
  276.     case TIOCGWINSZ:
  277.         status = Fs_IOControl(fd, IOC_TTY_GET_WINDOW_SIZE,
  278.         0, (Address) NULL, sizeof(struct winsize), (Address) buf);
  279.         break;
  280.  
  281.         case TIOCSWINSZ:
  282.         status = Fs_IOControl(fd, IOC_TTY_SET_WINDOW_SIZE,
  283.         sizeof(struct winsize), (Address) buf, 0, (Address) NULL);
  284.         break;
  285.  
  286.         case TIOCNOTTY:
  287.         status = Fs_IOControl(fd, IOC_TTY_NOT_CONTROL_TTY, 0,
  288.             (Address) NULL, 0, (Address) NULL);
  289.         break;
  290.     /*
  291.      * Graphics requests - decstations.
  292.      */
  293.     case QIOCGINFO:
  294.         status = Fs_IOControl(fd, IOC_GRAPHICS_GET_INFO,
  295.         0, (Address) NULL, sizeof(DevScreenInfo *), (Address)buf);
  296.         break;
  297.     case QIOCPMSTATE:
  298.         status = Fs_IOControl(fd, IOC_GRAPHICS_MOUSE_POS,
  299.         sizeof(DevCursor), (Address) buf, 0, (Address)NULL);
  300.         break;
  301.     case QIOWCURSORCOLOR:
  302.         status = Fs_IOControl(fd, IOC_GRAPHICS_CURSOR_COLOR,
  303.         sizeof(unsigned int [6]), (Address) buf, 0, (Address)NULL);
  304.         break;
  305.     case QIOCINIT:
  306.         status = Fs_IOControl(fd, IOC_GRAPHICS_INIT_SCREEN,
  307.         0, (Address) NULL, 0, (Address)NULL);
  308.         break;
  309.     case QIOCKPCMD:
  310.         status = Fs_IOControl(fd, IOC_GRAPHICS_KBD_CMD,
  311.         sizeof(DevKpCmd), (Address) buf, 0, (Address)NULL);
  312.         break;
  313.     case QIOCADDR:
  314.         status = Fs_IOControl(fd, IOC_GRAPHICS_GET_INFO_ADDR,
  315.         0, (Address) NULL, sizeof(DevScreenInfo *), (Address)buf);
  316.         break;
  317.     case QIOWCURSOR:
  318.         status = Fs_IOControl(fd, IOC_GRAPHICS_CURSOR_BIT_MAP,
  319.         sizeof(short[32]), (Address) buf, 0, (Address)NULL);
  320.         break;
  321.     case QIOKERNLOOP:
  322.         status = Fs_IOControl(fd, IOC_GRAPHICS_KERN_LOOP,
  323.         0, (Address) NULL, 0, (Address)NULL);
  324.         break;
  325.     case QIOKERNUNLOOP:
  326.         status = Fs_IOControl(fd, IOC_GRAPHICS_KERN_UNLOOP,
  327.         0, (Address) NULL, 0, (Address)NULL);
  328.         break;
  329.     case QIOVIDEOON:
  330.         status = Fs_IOControl(fd, IOC_GRAPHICS_VIDEO_ON,
  331.         0, (Address) NULL, 0, (Address)NULL);
  332.         break;
  333.     case QIOVIDEOOFF:
  334.         status = Fs_IOControl(fd, IOC_GRAPHICS_VIDEO_OFF,
  335.         0, (Address) NULL, 0, (Address)NULL);
  336.         break;
  337.     case QIOSETCMAP:
  338.         status = Fs_IOControl(fd, IOC_GRAPHICS_COLOR_MAP,
  339.         sizeof(DevColorMap), (Address) buf, 0, (Address)NULL);
  340.         break;
  341.     case QIOISCOLOR:
  342.         status = Fs_IOControl(fd, IOC_GRAPHICS_IS_COLOR,
  343.         0, (Address) NULL, sizeof (int), (Address) buf);
  344.         break;
  345.     case SIOCGIFCONF: {
  346.         struct ifconf *ifcPtr;
  347.  
  348.         /*
  349.          * Fake this IO control so that X will work (gasp!!).
  350.          */
  351.         ifcPtr = (struct ifconf *)buf;
  352.         ifcPtr->ifc_len = 0;
  353.         status = SUCCESS;
  354.         break;
  355.     }
  356.     /*
  357.      * Graphics requests - suns.
  358.      */
  359.     case FBIOGTYPE:
  360.         status = Fs_IOControl(fd, FBIOGTYPE, 0, (Address) NULL,
  361.             sizeof (fbtype), (Address) buf);
  362.         break;
  363.     case FBIOPUTCMAP:
  364.         status = Fs_IOControl(fd, FBIOPUTCMAP, sizeof (fbcmap),
  365.             (Address) buf, 0, (Address) NULL);
  366.         break;
  367.     case FBIOSVIDEO:
  368.         status = Fs_IOControl(fd, FBIOSVIDEO, sizeof (int),
  369.             (Address) buf, 0, (Address) NULL);
  370.         break;
  371.     case FBIOGVIDEO:
  372.         status = Fs_IOControl(fd, FBIOGVIDEO, 0, (Address) NULL,
  373.             sizeof (int), (Address) buf);
  374.         break;
  375.     case FBIOGPIXRECT:    /* not implemented yet */
  376.     case FBIOGINFO:        /* not implemented yet */
  377.     case FBIOGETCMAP:    /* not implemented yet */
  378.     case FBIOSATTR:        /* not implemented yet */
  379.     case FBIOGATTR:        /* not implemented yet */
  380.     case FBIOVERTICAL:    /* not implemented yet */
  381.         errno = EINVAL;
  382.         return(UNIX_ERROR);
  383.     /*
  384.      * Audio requests.
  385.      */
  386.     case AUDIOGETREG:
  387.         status = Fs_IOControl(fd, IOC_AUDIO_GETREG,
  388.         sizeof(struct audio_ioctl), (Address) buf, sizeof(struct
  389.         audio_ioctl), (Address)buf);
  390.         break;
  391.     case AUDIOSETREG:
  392.         status = Fs_IOControl(fd, IOC_AUDIO_SETREG,
  393.         sizeof(DevColorMap), (Address) buf, 0, (Address)NULL);
  394.         break;
  395.     case AUDIOREADSTART:
  396.         status = Fs_IOControl(fd, IOC_AUDIO_READSTART,
  397.         0, (Address) NULL, 0, (Address)NULL);
  398.         break;
  399.     case AUDIOSTOP:
  400.         status = Fs_IOControl(fd, IOC_AUDIO_STOP,
  401.         0, (Address) NULL, 0, (Address)NULL);
  402.         break;
  403.     case AUDIOPAUSE:
  404.         status = Fs_IOControl(fd, IOC_AUDIO_PAUSE,
  405.         0, (Address) NULL, 0, (Address)NULL);
  406.         break;
  407.     case AUDIORESUME:
  408.         status = Fs_IOControl(fd, IOC_AUDIO_RESUME,
  409.         0, (Address) NULL, 0, (Address)NULL);
  410.         break;
  411.     case AUDIOREADQ:
  412.         status = Fs_IOControl(fd, IOC_AUDIO_READQ,
  413.         0, (Address) NULL, sizeof(int), (Address)buf);
  414.         break;
  415.     case AUDIOWRITEQ:
  416.         status = Fs_IOControl(fd, IOC_AUDIO_WRITEQ,
  417.         0, (Address) NULL, sizeof(int), (Address)buf);
  418.         break;
  419.     case AUDIOGETQSIZE:
  420.         status = Fs_IOControl(fd, IOC_AUDIO_GETQSIZE,
  421.         0, (Address) NULL, sizeof(int), (Address)buf);
  422.         break;
  423.     case AUDIOSETQSIZE:
  424.         status = Fs_IOControl(fd, IOC_AUDIO_SETQSIZE,
  425.         sizeof(int), (Address) buf, 0, (Address)NULL);
  426.         break;
  427.  
  428.     /*
  429.      * Magnetic-tape requests:  need to define dev/mt.h before
  430.      * re-enabling this code.  Can't use UNIX include files, because
  431.      * they want ioc.h, which redefines all the tty ioctls.
  432.      */
  433.  
  434. #ifdef notdef
  435.     case MTIOCTOP: {
  436.         /*
  437.          * Have to peek into the request buffer to map the specific
  438.          * tape commands.
  439.          */
  440.         Dev_TapeCommand cmd;
  441.         struct mtop *unixCmdPtr = (struct mtop *)buf;
  442.  
  443.         if (unixCmdPtr->mt_op > MTERASE ||
  444.         unixCmdPtr->mt_op < 0) {
  445.         errno = EINVAL;
  446.         return(UNIX_ERROR);
  447.         }
  448.         cmd.command = compatTapeIOCMap[unixCmdPtr->mt_op];
  449.         cmd.count = unixCmdPtr->mt_count;
  450.         status = Ioc_TapeCommand(fd, (Address)&cmd);
  451.         break;
  452.     }
  453.     case MTIOCGET: {
  454.         Dev_TapeStatus stat;
  455.         struct mtget *unixStatPtr;
  456.         /*
  457.          * DO ME, check sys/mtio.h
  458.          */
  459.     }
  460. #endif notdef
  461.  
  462.     /*
  463.      * Unknown requests:
  464.      */
  465.  
  466.     default:
  467.         DecodeRequest(request);
  468.         errno = EINVAL;
  469.         return(UNIX_ERROR);
  470.     }
  471.  
  472.     if (status != SUCCESS) {
  473.         errno = Compat_MapCode(status);
  474.         return(UNIX_ERROR);
  475.     }
  476.  
  477.     return(UNIX_SUCCESS);
  478. }
  479.  
  480.  
  481.  
  482. /*
  483.  *----------------------------------------------------------------------
  484.  *
  485.  * DecodeRequest --
  486.  *
  487.  *    Takes a UNIX ioctl request and prints the name of the request
  488.  *    on the standard error file.
  489.  *
  490.  * Results:
  491.  *    None.
  492.  *
  493.  * Side effects:
  494.  *    None.
  495.  *
  496.  *----------------------------------------------------------------------
  497.  */
  498.  
  499. typedef struct {
  500.     char *name;
  501.     int     request;
  502. } RequestName;
  503.  
  504. static void
  505. DecodeRequest(request)
  506.     int request;
  507. {
  508.     register int i;
  509.     /*
  510.      * The following list contains all the ioctls in 
  511.      * /usr/include/sys/ioctl.h (SunOS 3.2), and
  512.      * /usr/include/sys/termios.h (SunOS 4.0).
  513.      */
  514.     const static RequestName mapping[] = {
  515.     {"TIOCGETD",    TIOCGETD},
  516.     {"TIOCSETD",    TIOCSETD},
  517.     {"TIOCHPCL",    TIOCHPCL},
  518.     {"TIOCMODG",    TIOCMODG},
  519.     {"TIOCMODS",    TIOCMODS},
  520.     {"TIOCGETP",    TIOCGETP},
  521.     {"TIOCSETP",    TIOCSETP},
  522.     {"TIOCSETN",    TIOCSETN},
  523.     {"TIOCEXCL",    TIOCEXCL},
  524.     {"TIOCNXCL",    TIOCNXCL},
  525.     {"TIOCFLUSH",    TIOCFLUSH},
  526.     {"TIOCSETC",    TIOCSETC},
  527.     {"TIOCGETC",    TIOCGETC},
  528.     {"TIOCLBIS",    TIOCLBIS},
  529.     {"TIOCLBIC",    TIOCLBIC},
  530.     {"TIOCLSET",    TIOCLSET},
  531.     {"TIOCLGET",    TIOCLGET},
  532.     {"TIOCSBRK",    TIOCSBRK},
  533.     {"TIOCCBRK",    TIOCCBRK},
  534.     {"TIOCSDTR",    TIOCSDTR},
  535.     {"TIOCCDTR",    TIOCCDTR},
  536.     {"TIOCSLTC",    TIOCSLTC},
  537.     {"TIOCGLTC",    TIOCGLTC},
  538.     {"TIOCOUTQ",    TIOCOUTQ},
  539.     {"TIOCSTI",    TIOCSTI},
  540.     {"TIOCNOTTY",    TIOCNOTTY},
  541.     {"TIOCPKT",    TIOCPKT},
  542.     {"TIOCSTOP",    TIOCSTOP},
  543.     {"TIOCSTART",    TIOCSTART},
  544.     {"TIOCMSET",    TIOCMSET},
  545.     {"TIOCMBIS",    TIOCMBIS},
  546.     {"TIOCMBIC",    TIOCMBIC},
  547.     {"TIOCMGET",    TIOCMGET},
  548.     {"TIOCREMOTE",    TIOCREMOTE},
  549.     {"TIOCGWINSZ",    TIOCGWINSZ},
  550.     {"TIOCSWINSZ",    TIOCSWINSZ},
  551.     {"TIOCUCNTL",    TIOCUCNTL},
  552.     {"TIOCCONS",    TIOCCONS},
  553.     {"TIOCSSIZE",    TIOCSSIZE},
  554.     {"TIOCGSIZE",    TIOCGSIZE},
  555.     {"SIOCSHIWAT",    SIOCSHIWAT},
  556.     {"SIOCGHIWAT",    SIOCGHIWAT},
  557.     {"SIOCSLOWAT",    SIOCSLOWAT},
  558.     {"SIOCGLOWAT",    SIOCGLOWAT},
  559.     {"SIOCADDRT",    SIOCADDRT},
  560.     {"SIOCDELRT",    SIOCDELRT},
  561.     {"SIOCSIFADDR",    SIOCSIFADDR},
  562.     {"SIOCGIFADDR",    SIOCGIFADDR},
  563.     {"SIOCSIFDSTADDR",    SIOCSIFDSTADDR},
  564.     {"SIOCGIFDSTADDR",    SIOCGIFDSTADDR},
  565.     {"SIOCSIFFLAGS",    SIOCSIFFLAGS},
  566.     {"SIOCGIFFLAGS",    SIOCGIFFLAGS},
  567.     {"SIOCGIFCONF",    SIOCGIFCONF},
  568.     {"SIOCGIFBRDADDR",    SIOCGIFBRDADDR},
  569.     {"SIOCSIFBRDADDR",    SIOCSIFBRDADDR},
  570.     {"SIOCGIFNETMASK",    SIOCGIFNETMASK},
  571.     {"SIOCSIFNETMASK",    SIOCSIFNETMASK},
  572.     {"SIOCGIFMETRIC",    SIOCGIFMETRIC},
  573.     {"SIOCSIFMETRIC",    SIOCSIFMETRIC},
  574.     {"SIOCSARP",    SIOCSARP},
  575.     {"SIOCGARP",    SIOCGARP},
  576.     {"SIOCDARP",    SIOCDARP},
  577.     {"TCXONC",      TCXONC},
  578.     {"TCFLSH",      TCFLSH},
  579.     {"TCGETS",      TCGETS},
  580.     {"TCSETS",      TCSETS},
  581.     {"AUDIOREADSTART",    AUDIOREADSTART},
  582.     {"AUDIOPAUSE",    AUDIOPAUSE},
  583.     {"AUDIORESUME",    AUDIORESUME},
  584.     {"AUDIOSTOP",    AUDIOSTOP},
  585.     {"AUDIOREADQ",    AUDIOREADQ},
  586.     {"AUDIOWRITEQ",    AUDIOWRITEQ},
  587.     {"AUDIOGETQSIZE",    AUDIOGETQSIZE},
  588.     {"AUDIOSETQSIZE",    AUDIOSETQSIZE},
  589.     {"AUDIOSETREG",    AUDIOSETREG},
  590.     {"AUDIOGETREG",    AUDIOGETREG},
  591.     };
  592.  
  593.     if ((request == TIOCGSIZE) || (request == TIOCGWINSZ)) {
  594.     /*
  595.      * Special-case TIOCGSIZE since every visually-oriented program
  596.      * uses it and it's annoying to constantly get the messages.
  597.      */
  598.     return;
  599.     }
  600.  
  601.     /*
  602.      * For now search the list linearly. It's slow but simple...
  603.      */
  604.     for (i = sizeof(mapping)/sizeof(*mapping); --i >= 0;) {
  605.     if (request == mapping[i].request) {
  606.         fprintf(stderr, "ioctl: bad command %s\n", mapping[i].name);
  607.         return;
  608.     }
  609.     }
  610.     fprintf(stderr, "ioctl: bad command 0x%x\n", request);
  611.     return;
  612. }
  613.